#include "parser.h"

using namespace std;

/*
 * Construtor da classe: cria novos vetores de palavras e frases
 */
Parser::Parser()
{
	words = new vector<string>;
	phrases = new vector<string>;
}

/*
 * Destrutor da classe: libera memoria alocada para os vetores
 */
Parser::~Parser()
{
	delete words;
	delete phrases;
}

/*
 * Metodo para separar os blocos lidos na classe 'Loader' em palavras e/ou frase
 * 	dependendo do modo de execucao
 */
void Parser::splitBlock(string *str, short mode)
{
	string tmp(*str);
	size_t blank_pos;

	/* procura pelo primeiro ' ' (espaco) no bloco lido */
	blank_pos = tmp.find_first_of(" ");
	while(tmp.length() != 0) {
		/* gera uma substring ateh este espaco */
		string sub_str;
		sub_str = tmp.substr(0, blank_pos);
		removeCharacters(sub_str);

		if (sub_str.length() > 1) {
			/* insere a palavra no vetor de palavras */
			words->push_back(sub_str);
		}

		/* remove a substring do bloco inicial para a proxima iteracao */
		tmp.erase(0, blank_pos + 1);
		/* e procura pelo proximo espaco */
		blank_pos = tmp.find_first_of(" ");
	}
	
	/* se o modo de execucao for WORDS_PHRASES faz o mesmo procedimento para as frases */
	if (mode == WORDS_PHRASES) {
		tmp = *str;

		unsigned int i = 0;
		for (string::iterator it = tmp.begin(); it != tmp.end(); it++) {
			string sub_str;
			if(*it == '.' || *it == '!' || *it=='?' || *it== '\n'){
				sub_str = tmp.substr(0, i);
				phrases->push_back(sub_str);
				tmp.erase(0, i + 1);
				it = tmp.begin() - 1; // como eu apaguei a frase, volto o ponteiro para a posicao (incial -1) poq tem o it++ no for 
				i=-1; // reseto o i, pois eh ele quem marca quantos caracters eu vou apagar
			}
			i++;
			// problema com final do bloco sem elementos de fim de frase
			if(it + 1 == tmp.end()) {
				sub_str = tmp;
				phrases->push_back(sub_str);
			}
		}
	}
}

/*
 * Metodo para remover caracteres de pontuacao de uma string
 */
void Parser::removeCharacters(string &str)
{
	string::iterator it;
	for (it = str.begin(); it < str.end(); it++) {
		if (*it == '\n' || *it == '\r') {
			str.erase(it);
			it--;
		}
		if (*it == '.' || *it == ',' || *it == '(' || *it == ')' || *it == '|' || *it == '?' || *it == ':' || *it == ' ') {
			str.erase(it);
			it--;
		}
	}
}

/*
 * Retorna o vetor de palavras
 */
vector<string> *Parser::getWords()
{
	return words;
}

/*
 * Retorna o vetor de frases
 */
vector<string> *Parser::getPhrases()
{
	return phrases;
}
